/*力扣203 移动0
 * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。

请注意 ，必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:

输入: nums = [0]
输出: [0]
 

提示:

1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
 

进阶：你能尽量减少完成的操作次数吗？
 */

//算法原理：
//属于数组划分/数组分块类问题
//使用双指针算法-->利用数组下标充当指针


//两个指针的作用：
//1. cur指针：从左往右扫描数组，遍历数组
//2. dest指针：已经处理的区间内，非零元素的最后一个位置*

//三个区间：
//[0, dest]     [dest + 1, cur - 1]     [cur, n - 1]
//   非0                0                  待处理

//如何做到：
//cur从前往后遍历的过程中：
//1.遇到0元素，cur++
//2.遇到非0元素
//      a. swap(nums[dest + 1], nums[cur])
//      b. dest++, cur++
 

 class Solution {
    public void moveZeroes(int[] nums) {
        int n=nums.length;
        for(int cur=0,dest=-1;cur<n;cur++){
            if(nums[cur]!=0){
                int tem=nums[++dest];
                nums[dest]=nums[cur];
                nums[cur]=tem;
            }
        }
    }
}

